package com.atguigu.chaptar4

import com.alibaba.fastjson.JSON

import scala.beans.BeanProperty
import scala.util.Random

object $02_TypeCheck {
  //1.定义三个类,其中狗类和猪类继承动物类
  class Animal
  class Dog extends Animal{
    val name ="dog"
  }
  class Pig extends Animal{
    val name = "pig"
  }
  //2.外界定义一个方法返回狗对象或猪对象
  def getAnimal()={
    val i = Random.nextInt(10)
    if(i%2==0)new Pig
    else new Dog
  }
//3.主方法里调用该方法,发现一个问题,只知道返回的对象属于动物类型(多态),不知道具体子类
  //,这样就无法使用个子类对象的专有属性方法了,先判断对象属于的子类,再强转成该子类
  def main(args: Array[String]): Unit = {
    val animal = getAnimal()//4.判断及强转
    if(animal.isInstanceOf[Pig]) println(animal.asInstanceOf[Pig].name)
    else println(animal.asInstanceOf[Dog].name)
    //(工作常用!)如何知道对象的具体类是啥(class形式)
    println(animal.getClass)
    //(工作常用!)如何获取类的class形式
    println(classOf[Pig])
    //(工作常用!)将json字符串转换成对象
    val json = """{"name":"wzx","age":18}"""//对象的json格式,注意三引号里的引号不用转义,双引号里的引号需要转义
    val person = JSON.parseObject(json, classOf[Person])
    println(person.getAge)//因为类中age使用了@BeanProperty,所以可以对象使用setget方法

  }
  class Person{//该类是为了上面的json字符串转换成对象的格式,使用该类类对象
    @BeanProperty var name:String= _ //(工作常用!)@BeanProperty是为了兼容javaAPI,很多API底层使用了java的setget方法
    @BeanProperty var age:Int= _
  }

}
